#include <regx52.h>
int time=0;
int time_seed;
unsigned int i;
unsigned int count1;
int count2=0;
int x=0;
/**
 * 实现一个打地鼠游戏，随机点亮一个灯，用户按下对应按键。灯灭后，再随机亮灯。
 * 检测游戏失败：设定一个阈值，连续进入几次中断后，发现上一次点亮的灯没有被熄灭，就认定游戏失败
 * 将当前点亮的灯进行闪烁。
 *
 * 增加一个开始按钮，点击开始按钮，游戏重新开始。
 * 如果在游戏进行中，点击该按钮，则暂停游戏，再次点击则恢复游戏。
 * 暂停游戏中，进行流水灯闪烁。
 */

void timer0_init()
{
    TMOD &= 0xF0;
    TMOD |= 0x01;

    TH0 = 0xDB;

    TL0 = 0xFF;

    TR0 = 1;

    ET0 = 1;

    EA = 1;
    
    PT0 = 1;
}
void start(int y,int m);
void start2();
void timer1_init()
{
    TMOD &= 0x0F;   
    TMOD |= 0x10;   
    
    TH1 = 0xFC;     
    TL1 = 0x18;

    TR1=0;
    ET1=1;
    
    EA=1;
}

void Timer1_ISR() interrupt 3
 {
    TH1 = 0x3C;    
    TL1 = 0xB0;
    x++;
    if(x==2000)
    {
     count2=3;
     x=0;
    }
}
unsigned int timer_rand()
{
    time_seed = (time * 123 + 8) % 8;

    return time_seed;
}

void delay_ms(unsigned int ms)
{
    unsigned int i, j;
    for (i = 0; i < ms; i++)
    {
        for (j = 0; j < 123; j++)
            ;
    }
}

void timer0_ISR() interrupt 1
{ 
  TH0 = 0xDB;
  TL0 = 0xFF;
  time=time+1;
}

void receive(unsigned int i)
{
    if(i==0)
    {
     P2=~0x01;
    }
    if(i==1)
    {
     P2=~0x02;
    }
    if(i==2)
    {
     P2=~0x04;
    }
    if(i==3)
    {
     P2=~0x08;
    }
    if(i==4)
    {
     P2=~0x10;
    }
    if(i==5)
    {
     P2=~0x20;
    }
    if(i==6)
    {
     P2=~0x40;
    }
    if(i==7)
    {
     P2=~0x80;
    }
}

unsigned int getchar()
{
   unsigned int b[9]={8,0,1,2,3,4,5,6,7};
   int a=0;
   if(P1_7==0)
   {
    while(P1_7==0){}
    a=8;
   }
   if(P1_6==0)
   {
    while(P1_6==0){}
    a=7;
   }
   if(P1_5==0)
   {
    while(P1_5==0){}
    a=6;
   }
   if(P1_4==0)
   {
    while(P1_4==0){}
    a=5;
   }
    if(P1_3==0)
   {
    while(P1_3==0){}
    a=4;
   }
   if(P1_2==0)
   {
    while(P1_2==0){}
    a=3;
   }
   if(P1_1==0)
   {
    while(P1_1==0){}
    a=2;
   }
   if(P1_0==0)
   {
    while(P1_0==0){}
    a=1;
   }
   return b[a];
}

void waterlight()
{
  int i;
  for(i=0;i<=7;i++)
  {
    P2=~(0x01<<i);
    start(1,500);
  }
}
void main()
{
    timer0_init();
    timer1_init();
    while(1)
    {
       switch (count2)
       {
       case 0:
        start(1,0);
        break;
       
        case 1:
          TR1=1;
          i=timer_rand();
          receive(i);
          start2();
        break;

        case 2:
         waterlight();
        break;

        case 3:
         TR1=0;
         receive(i);
         start(0,500);
         P2=0xFF;
         start(0,500);
         x=0;
         break;

        case 4:
         TR1=0;
         x=0;
         P2=0xFF;
         delay_ms(50);
         count2=1;
       }
    }
}

void start(int y,int m)
{
   int j;
   for(j=0;j<=m;j++)
   {
    if(P3_0==0)
       {
        while(P3_0==0){}
        count2=y;
       }
       delay_ms(1);
   }
}

void start2()
{
   int j;
   int k;
   for(j=0;j<=2000;j++)
   {
    k=getchar();
    if(P3_0==0)
    {
      TR1=0;
      while(P3_0==0){}
      x=0;
      count2=2;
    }
    if(k==i)
    {
      k=8;
      count2=4;
      break;
    }
    delay_ms(1);
   }
}